/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package de.jonasjelten.jcalc.gui;

import de.jonasjelten.jcalc.math.JMathOps;
import java.awt.*;
import javax.swing.JComponent;
import javax.swing.Timer;

public class MemoryMonitor extends JComponent {
    //JCalc jcalc;

    private int memoryUse[];
    private int updateCounter;
    private String displayStrings[];
    int memoryaktualisierungszeit = 500; // ms
    int anzahlspeicherungen = 256;

    public MemoryMonitor() {
        //this.jcalc = jcalc;
        

        memoryUse = new int[anzahlspeicherungen];
        displayStrings = new String[10];
        setPreferredSize(new Dimension(anzahlspeicherungen, 196));
        setMinimumSize(new Dimension(anzahlspeicherungen, 196));
        setMaximumSize(new Dimension(anzahlspeicherungen, 196));

        new Timer(memoryaktualisierungszeit, new MemAktualisator(this)).start();
        setBackground(Color.BLACK);

    }

    private void updateStats() {
        long total = Runtime.getRuntime().totalMemory(); // memory values are in bytes
        long free = Runtime.getRuntime().freeMemory();
        long max = Runtime.getRuntime().maxMemory();

        long used = total - free; // benutzter Speicher
        //System.gc();
        displayStrings[0] = "Memory used: " + (used / 1024 / 1024) + " mb ("+ free + " mb (" + ((free * 100) / max) + "%) free)";
        //if(updateCounter++ > memoryUse.length)
        JMathOps.shiftRight(memoryUse);
        memoryUse[0] = (int) ((used * 100) / Runtime.getRuntime().maxMemory());
        repaint();
    }

    @Override
    public void paint(Graphics g) {
        
        g.setColor(Color.white);
        g.fillRect(0, 0, anzahlspeicherungen, 192); // weiße fläche zeichnen
        for (int i = 0; i < anzahlspeicherungen; i++) {
            int k = memoryUse[i];
            g.setColor(new Color(k + 10 << 16));
            g.fillRect(i, 100 - k, 1, k);
        }

        g.setColor(Color.BLACK);
        for (int j = 0; j < displayStrings.length; j++) {
            String s = displayStrings[j];
            if (s != null) {
                g.drawString(s, 32, 116 + j * 16);
            }
        }

    }

    static void update(MemoryMonitor monitor) {
        monitor.updateStats();
    }
}
